/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.nextel.project.cliente;
import pe.com.nextel.http.MensajeHttp;
import com.nextel.project.Configuracion;
import com.nextel.project.cliente.bean.ClienteBean;
import com.nextel.project.cliente.bean.ClientePorCodigoBean;
import com.nextel.project.cliente.bean.ClientePorNombreBean;
import com.nextel.project.cliente.mvc.MVCClienteBusqueda;
import com.nextel.project.cliente.mvc.MVCClienteDetalle;
import com.nextel.project.cliente.mvc.MVCClienteEnLinea;
import com.nextel.project.cliente.mvc.MVCClienteResultado;
import com.nextel.project.cliente.rms.RMSCliente;
import com.nextel.project.cliente.rms.RMSClientePorCodigo;
import com.nextel.project.cliente.rms.RMSClientePorNombre;
import com.nextel.project.dao.HttpControl;
import com.nextel.project.usuario.ControlUsuario;
import pe.com.nextel.rms.DataInputStreamX;
import pe.com.nextel.rms.RecordStoreInputStream;
import pe.com.nextel.main.ControlBase;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.StringUtils;

/**
 *
 * 
 */
public class ControlCliente extends ControlBase {
    
    private static final ControlCliente control = new ControlCliente();
    public ClienteBean currentCliente;
    public final RMSCliente rmsCliente = new RMSCliente();
    public final RMSClientePorCodigo rmsClientePorCodigo = new RMSClientePorCodigo();
    public final RMSClientePorNombre rmsClientePorNombre = new RMSClientePorNombre();
    public final MVCClienteBusqueda mvcClienteBusqueda = new MVCClienteBusqueda();
    public final MVCClienteDetalle mvcClienteDetalle = new MVCClienteDetalle();
    public final MVCClienteResultado mvcClienteResultado = new MVCClienteResultado();
    public final MVCClienteEnLinea mvcClienteEnLinea = new MVCClienteEnLinea();
    public Thread threadBusqueda;
    
    // private HashMap hashGeneral;
    
    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlCliente getInstance() {
        return control;
    }
    
    /**
     * para no crear mas instancias
     */
    private ControlCliente() {
    }
    
    public void joinThreadBusqueda() {
        try {
            if (threadBusqueda != null && threadBusqueda.isAlive()) {
                threadBusqueda.join();
            }
        } catch (Exception e) {
        }
    }
    
    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    /********************************/
    /* CLIENTES
    /********************************/
    public void limpiarMemoria() {
        
        if (currentCliente != null) {
            currentCliente.clear();
            currentCliente = null;
        }
        
        System.gc();
    }
    
    public void obtenerclientePorNombre(ClientePorNombreBean clientePorNombre) {
        try {
//            System.out.println("getIdRecordCliente(), getPosRecordCliente()" + clientePorNombre.getIdRecordCliente() + "|" + clientePorNombre.getPosRecordCliente());
            ClienteBean cliente = (ClienteBean) rmsCliente.getObject(clientePorNombre.getIdRecordCliente(), clientePorNombre.getPosRecordCliente());
            currentCliente = (cliente);
            setCurrent(mvcClienteDetalle);
        } catch (Exception e) {
            e.printStackTrace();
            showError("Error : " + e, mvcClienteBusqueda.showScreen());
        }
    }    

   





    
    public void buscarPorCodigoCliente(String codigo) {
        //#debug
//        System.out.println("-->Midlet.buscarPorCodigoCliente");
        try {
//            System.out.println("rmsClientePorCodigo= " + rmsClientePorCodigo);
            if(rmsClientePorCodigo==null){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DEBE_SINCRONIZAR), mvcClienteBusqueda.showScreen());//"Primero debe sincronizar"
            }
            
            ClientePorCodigoBean clientePorcodigo = rmsClientePorCodigo.buscarCliente(codigo.trim());
            
            if (clientePorcodigo != null) {
            

                ClienteBean cliente = (ClienteBean) rmsCliente.getObject(clientePorcodigo.getIdRecordCliente(), clientePorcodigo.getPosRecordCliente());

                currentCliente = (cliente);
  
                setCurrent(mvcClienteDetalle);
            } else {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_ENCONTRARON_RESULTADOS), mvcClienteBusqueda.showScreen());//"No se encontraron resultados"
            }
        } catch (Exception e) {
//            e.printStackTrace();
            if(e.getMessage().equals("Sincronizar"))
            {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SINCRONIZAR_CLIENTES), mvcClienteBusqueda.showScreen());//"Se debe sincronizar los clientes"
            }
            else
            {
                showError("Error : " + e, mvcClienteBusqueda.showScreen());
            }
        }
    }
        
    
    public void buscarPorNombreCliente(final String nombre) {
        //#debug
        //System.out.println("Midlet.buscarPorNombreCliente");
        
        try {

            joinThreadBusqueda();
            setCurrent(mvcClienteResultado);
            threadBusqueda = null;
            threadBusqueda = new Thread() {


                public void run() {
                    try {
                        rmsClientePorNombre.buscarPorNombreClientes(nombre, mvcClienteResultado);
                    } catch (Exception e) {
//                        e.printStackTrace();
                      }
                }
            };
            threadBusqueda.start();
         
        } catch (Exception e) {
             e.printStackTrace();
            showError("Error : " + e, mvcClienteBusqueda.showScreen());
            
        }
    }
    
    public void eliminarDatos()throws Exception{
        rmsCliente.deleteAll();
        rmsClientePorCodigo.deleteAll();
        rmsClientePorNombre.deleteAll();
    }
    
    public void actualizarCliente(ClienteBean bean) throws Exception {
/*        System.out.println("a"+bean.getCli_giro());
        System.out.println("b"+bean.getCli_secuencia());
        System.out.println("c"+bean.getCodEmpresa());
        System.out.println("d"+bean.getCodigo());
        System.out.println("e"+bean.getDeuda());
        System.out.println("f"+bean.getDireccion());
        System.out.println("g"+bean.getEstado());
        System.out.println("h"+bean.getNombre());
        System.out.println("i"+bean.getTcli_cod());*/
        rmsCliente.actualizarObjectLista(bean);
//        System.out.println("b");
    }
    
    public void buscarClienteOnline(String codigo) {
        try {
            //System.out.println("ClienteBean= " + ControlCliente.getInstance().rmsCliente.cantidadObject());
            if(ControlCliente.getInstance().rmsCliente.cantidadObject() == 0){
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DEBE_SINCRONIZAR), ControlUsuario.getInstance().mvcMenu.showScreen());//"Primero debe sincronizar"
            }else{
          
            if(!StringUtils.withSignal()) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA),ControlUsuario.getInstance().mvcMenu.showScreen());//  MVCUsuario.class mvcClienteEnLinea.showScreen());//"Zona sin cobertura, intente realizar la consulta mas tarde"
                return;
             }

            ControlCliente.getInstance().currentCliente = null;
            ClienteBean cliente = new ClienteBean();
            cliente.setCodigo( codigo );
            cliente.setCodEmpresa(ControlUsuario.getInstance().currentUsuario.getCompania());

            getMensajeHttp().setUrl(Configuracion.URL_CONSULTA_ONLINE);
            getMensajeHttp().setMensaje( cliente.writeXML() );

            System.out.println("url =" + Configuracion.URL_CONSULTA_ONLINE);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));

            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_CONSULTAONLINE);
            iniciarConexionHTTP();
          }
        } catch (Exception e) {
            e.printStackTrace();
          
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_SIN_COBERTURA),ControlUsuario.getInstance().mvcMenu.showScreen());//"Zona sin cobertura, intente realizar la consulta mas tarde"
          
        }
    }
    
    public void procesarConsultaOnline(MensajeHttp mensajeHttp) {
       // System.out.println("procesarConsultaOnline");
        try {
            ControlCliente.getInstance().limpiarMemoria( );
            procesarDataConsultaOnline(mensajeHttp);
            processConsultaOnline( );
            
            System.gc();
            
        } catch (Exception e) {
            e.printStackTrace();
            ControlCliente.getInstance().showMensaje(e+"", mvcClienteEnLinea.showScreen());
        }
    }
    public void procesarDataConsultaOnline(MensajeHttp mensajeHttp) throws Exception {
        //#debug
        System.out.println("procesarDataConsultaOnline");
        InputStream input = mensajeHttp.getInput();
        byte[] bufferData = new byte[5120]; //10240 //5120

        int amountData = 0;
        try {
            RecordStore.deleteRecordStore("RS_CONSULTAONLINE_TMP");
        } catch (RecordStoreException ex) {

        }

        
        RecordStore rs = null;
        try {
            rs = RecordStore.openRecordStore("RS_CONSULTAONLINE_TMP", true);
            while ((amountData = input.read(bufferData)) != -1) {
                rs.addRecord(bufferData, 0, amountData);
            }
            
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
            throw ex;
        } catch (IOException ex) {
            ex.printStackTrace();
            throw ex;
            
        } finally {
            
            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                bufferData = null;
            } catch (Exception ex) {

            }
        }
    }
    public void processConsultaOnline() throws Exception {
        //#debug
//        System.out.println("processConsultaOnline");
        
        RecordStore rs = null;
        InputStream input = null;
        try {
            
            rs = RecordStore.openRecordStore("RS_CONSULTAONLINE_TMP", true);
            input = new RecordStoreInputStream(rs);
            guardarCliente(input);
            
        } catch (Exception ex) {
             System.out.println("jd2");
            throw ex;
        } finally {
            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                if (input != null) {
                    input.close();
                    input = null;
                }
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                RecordStore.deleteRecordStore("RS_CONSULTAONLINE_TMP");

            } catch (RecordStoreException e) {
                e.printStackTrace();
            }
        }
    }
    
    
    public void guardarCliente(InputStream input) throws Exception {
        //System.out.println("guardarCliente");
        
        DataInputStreamX dataInput = new DataInputStreamX(input);

        try {
            
            int i =  dataInput.readInt();
            System.out.println("datos.lenth= " + i);
            
            if(i<=0) {
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_CLIENTE_NOEXISTE), ControlCliente.getInstance().mvcClienteEnLinea.showScreen());//"El cliente no existe"
                return;
            }
        
            ControlCliente.getInstance().currentCliente = new ClienteBean();
            
            ControlCliente.getInstance().currentCliente.setPosicionID(dataInput.readShort());

            ControlCliente.getInstance().currentCliente.setCodigo(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setNombre(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setTcli_cod(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setCli_giro(dataInput.readString());
            
            

            ControlCliente.getInstance().currentCliente.setCli_secuencia(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setDireccion(dataInput.readString());
            
            ControlCliente.getInstance().currentCliente.setCodEmpresa(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setDeuda(dataInput.readString( ));

            ControlCliente.getInstance().currentCliente.setEstado(dataInput.readString());

            ControlCliente.getInstance().currentCliente.setId(dataInput.readLong());

             ControlCliente.getInstance().currentCliente.setEnLinea(true);

            
            ControlCliente.getInstance().setCurrent( ControlCliente.getInstance().mvcClienteDetalle );
        } catch (Exception ex) {
            
        } finally {
            dataInput.close();
            dataInput = null;
        }
    }
    
    public String obtenerNombreCliente_Detalle()
    {
        String resultado = "";
        
        String nombre = IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NOMBRECLIENTE);
        
        resultado = nombre;
                
        if(!nombre.equals(""))
        {
            resultado = resultado + ": ";
        }
        return resultado;
    }
}
